package com.password.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

/**
 * MD5工具类用于加密和校验用户密码
 * 
 * @author yzh
 * @date 2020年5月27日
 *
 */
public class PasswordUtil {
	private final static String defaultEncode = "UTF-8";

	/**
	 * MD5加密，其会自动生成16个字符的颜值，并且利用掩码进行加密,加密后需要配合verifyMD5()进行密码校验
	 * 
	 * @author yzh
	 * @date 2020年5月27日
	 */
	public static String getEncrptPassword(String password) {
		try {
			// 增加16位的盐值
			String salt = StringUtil.getRandomString(16);
			return getMD5(password, salt);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	private static String getMD5(String plainText, String salt) {
		try {
			// 增加16位的盐值
			plainText = salt + plainText;
			byte[] bytes = plainText.getBytes(defaultEncode);
			byte[] reBytes = new byte[bytes.length + FileEncrptUtil.MASK.length];
			System.arraycopy(FileEncrptUtil.MASK, 0, reBytes, 0, FileEncrptUtil.MASK.length);
			System.arraycopy(bytes, 0, reBytes, FileEncrptUtil.MASK.length - 1, bytes.length);
			byte[] md5Encode = md5Encode(reBytes);
			return salt + Base64.getEncoder().encodeToString(md5Encode);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	public static byte[] md5Encode(byte[] data) throws NoSuchAlgorithmException {
		MessageDigest md = MessageDigest.getInstance("MD5");// 获取MD5实例
		md.update(data);// 此处传入要加密的byte类型值
		return md.digest();// 此处得到的是md5加密后的byte类型值
	}

	public static boolean verifyPassword(String encode, String password) {
		String salt = encode.substring(0, 16);
		return getMD5(password, salt).equals(encode);
	}

}